#include "Vaisseau.h"

#include <GL/gl.h>
#include <GL/glu.h>
#include <cmath>
#include <vector>
#include <SDL/SDL.h>
#include <iostream>

#include "SimpleShoot.h"
#include "CircleShoot.h"
#include "Life.h"

Vaisseau::Vaisseau(double x, double y, double largeur, double hauteur) {
    this->x = x;
    this->y = y;
    this->largeur = largeur;
    this->hauteur = hauteur;
}

Vaisseau::~Vaisseau() {
    lstShoot.clear();
    lstExplosion.clear();
    propulseur.clear();
    delete lifeBar;
}

void Vaisseau::Deplacer(int largeurWin, int hauteurWin) {
    this->x += cos(this->angle*M_PI/180)*this->vitesse/15;
    this->y += sin(this->angle*M_PI/180)*this->vitesse/15;

    if(this->y>hauteurWin){
        this->y -= hauteurWin;
    }
    if(this->y<0){
        this->y = hauteurWin;
    }
    if(this->x>largeurWin){
        this->x -= largeurWin;
    }
    if(this->x<0){
        this->x = largeurWin;
    }

    Trace* t = new Trace(x, y, angle, vitesse);
    propulseur.push_back(t);
}

void Vaisseau::Tirer(SDLKey pushedKey) {
    switch (pushedKey){
        case SDLK_SPACE:
            this->lstShoot.push_back(new SimpleShoot(x, y, angle));
            break;
        case SDLK_q:
            this->lstShoot.push_back(new CircleShoot(x, y, angle));
            break;
        default:
            break;
    }
}

void Vaisseau::PurgeTrace() {
    if (propulseur.size()!=0) {
        propulseur.erase(propulseur.begin());
        while(propulseur.size()>70){
            propulseur.erase(propulseur.begin());
        }
    }

}

void Vaisseau::PurgeMissile(double largeur, double hauteur) {
    for(int i=0; i<lstShoot.size(); i++) {
        if(lstShoot[i]->isOffScreen(largeur, hauteur)){
            lstShoot.erase(lstShoot.begin() + i);
        }
    }
}

Life* Vaisseau::getLifeBar(){
    return this->lifeBar;
}

double Vaisseau::getX() {
    return this->x;
}
double Vaisseau::getY(){
    return this->y;
}
double Vaisseau::getLargeur(){
    return this->largeur;
}
double Vaisseau::getHauteur(){
    return this->hauteur;
}
vector<Shoot*> Vaisseau::getShoots(){
    return this->lstShoot;
}

void Vaisseau::touchee() {
    Explosion* e = new Explosion(x, y, angle, vitesse);
    lstExplosion.push_back(e);
}

